package com.cqc.web;

import com.cqc.common.Result;
import com.cqc.service.ProductService;
import com.cqc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.async.DeferredResult;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

/**
 * 这个controller演示同步和异步的区别。
 * 只设置了server.tomcat.threads.max=3 最大3个线程，每个请求都耗时1分钟
 * 如果是同步请求sync： 当发出3个请求后，线程池耗光了，再发第4个请求 ，发现没有打印 日志。
 * 如果是异步请求async： 当发出3个请求后，耗时任务由自定义的异步线程池（ThreadPoolConfig）处理，主线程的线程池里的线程都是空闲的。
 * 再发第4个请求 ，还是可以输出日志。
 **/
@Controller
@RequestMapping("user")
public class UserController {


    @Autowired
    UserService userService;

    /**
     * http://localhost:8080/user/sync
     */
    @GetMapping("sync")
    @ResponseBody
    public Result sync() throws InterruptedException {
        System.out.println("Sync request completed by thread: " + Thread.currentThread().getId());
        userService.sync();
        return Result.successMsg(Thread.currentThread().getName());
    }

    /**
     * http://localhost:8080/user/async
     */
    @GetMapping("async")
    @ResponseBody
    public Result async() throws InterruptedException {
        System.out.println("Async request completed by thread: " + Thread.currentThread().getId());
        userService.async();
        return Result.successMsg(Thread.currentThread().getName());
    }


}
